# 红色:失败 或 告警 类 提示
PError(){
  echo -e "[ \033[1;31mERROR\033[0m ] `date '+%F %T'` $@"
}

# 绿色:指令执行成功 类 提示
POk(){
  echo -e "[ \033[1;32m OK \033[0m ] `date '+%F %T'` $@"
}

# 黄色:向用户提示普通信息,例如:"将要执行...指令"等
PInfo(){
  echo -e "[ \033[1;33mINFO\033[0m ] `date '+%F %T'` $@"
}

# 紫色 warning info
PWarn(){
  echo -e "[ \033[1;35mWARN\033[0m ] `date '+%F %T'` $@"
}

# 蓝色:read -p "`PNote` PID: "等交互 类 提示
PNote(){
  echo -e "[ \033[1;36mNOTE\033[0m ] `date '+%F %T'` $@"
}

Eval_exit(){
    PInfo "Running: \033[36m$@\033[0m"
    ! eval "$@" && PError "Failed to exec: $@" && exit 1
    return 0
}

Eval_cont(){
    PInfo "Running: \033[36m$@\033[0m"
    eval "$@"
}

#pro_name="$(echo "$0" | sed 's#^.*/##; s#.sh$##')"  # 删除'/'前的路径,删除'.sh'
pro_base="$(cd `dirname $0`;pwd)"
Eval_exit "type iostat chpasswd wget systemctl"                             # 监控磁盘IO以及下面的脚本可能要用到的命令

# 是否要安装 mysql jstat
read -p'是否安装mysql客户端命令？若要zabbix agent监控数据库,选y (y/n 默认:n) ' a        # answer
case $a in
    y|Y|yes|YES)
        read -p'!!! NOTE !!!  请修改 `mysql.status.up.sh` 脚本中的变量值，然后按任意键继续。' a
        mysql=1
        ;;
    *)
        mysql=0             # 0:不安装;其他数值,表示安装mysql客户端
        ;;
esac

read -p'是否安装jstat命令？若要zabbix agent监控JVM状态,选y (y/n 默认:n) ' a             # answer
case $a in
    y|Y|yes|YES)
        jstat=1
        ;;
    *)
        jstat=0
        ;;
esac

read -p'是否创建myzabbix用户？若要zabbix系统监控swap或保存zabbix agent的临时文件,选y (y/n 默认:n) ' a                 # answer
case $a in              # zabbix agent以myzabbix身份执行top命令，检查SWAP使用率Top10。而CPU和内存Top10则是由ps命令检查
    y|Y|yes|YES)
        myzabbix=1
        ;;
    *)
        myzabbix=0
        ;;
esac

if [[ $mysql != 0 ]]; then
    ! type mysql && PWarn "[mysql 命令不存在]: 无法监控数据库状态." && exit 1
fi
if [[ $jstat != 0 ]]; then
    ! type jstat && PWarn "[jstat 命令不存在]: 无法监控 JVM 的使用率." && exit 1
fi
if [[ $myzabbix != 0 ]]; then    # 我自己写的"smon.sh"脚本和"LLD规则"脚本会将临时文件写入/home/myzabbix目录
    if ! id myzabbix; then       # zabbix agent 以 myzabbix 身份检查 SWAP, smon 以 root 身份检查 SWAP
        PInfo '[[ `grep -Eac pam_pwquality /etc/pam.d/system-auth` -gt 0 ]]'" && sed -i '/pam_pwquality/s/.*pam_pwquality.*/#&/' /etc/pam.d/system-auth"
        PInfo '[[ `grep -Eac "pam_unix.so md5" /etc/pam.d/system-auth` -gt 0 ]]'" && sed -i '/pam_unix.so md5/s/.*pam_unix\.so md5.*/#&/' /etc/pam.d/system-auth"
        PInfo "sed -i '/pam_unix.so md5/a password\\\\tsufficient\\\\tpam_unix.so sha512' /etc/pam.d/system-auth"
        PInfo '若因PAM的配置问题导致 创建用户失败，可尝试执行上面三行命令后，重新创建用户'
        Eval_exit "groupadd -g1009 myzabbix && useradd -u1009 -g1009 myzabbix"  # 1001至1008都被华为云平台占用了。
                                                                                # yum安装Zabbix agent时会生成zabbix用户，但有时UID是996，有时是998，并不统一
    fi
    Eval_exit "mkdir -p /home/myzabbix && chmod 777 /home/myzabbix"    # SUSE11的useradd命令不会自动创建home目录，若根据等保要求设置了密码复杂度，改密码时需修改“/etc/pam.d/common-password”文件
    Eval_exit "echo 'myzabbix:myzabbix' |chpasswd && passwd -x 99999 myzabbix"  # 做了等保的主机的myzabbix用户密码会过期
    Eval_exit "usermod -G wheel myzabbix && usermod -G wheel zabbix"            # 有些主机做了等保整改，需将用户加入wheel组，才能执行su命令
    ! ls /home/myzabbix/.toprc && Eval_exit "cd /home/myzabbix" &&
        Eval_exit "wget --no-check-certificate https://10.170.205.6/.toprc || wget https://www.houseschan.cn/.toprc && chmod a+r /home/myzabbix/.toprc"    # .toprc目前仅适用于CentOS7
    ! ls /home/myzabbix/.toprc && PWarn "[.toprc 文件不存在]: 无法监控 SWAP 的使用率." && PInfo "可以按下面5个步骤配置top命令:
1.执行top,按'l'不显示第1行的Load Avg/Uptime,按3次't'不显示Task/Cpu states,按3次'm'不显示Mem/Swap usage
2.按'f',依照屏幕的快捷键提示,取消显示PR/NI/VIRT/RES/SHR/S/TIME+
3.依照屏幕的快捷键提示,显示SWAP,并把SWAP移动到COMMAND的前面(让SWAP出现在第5列),在SWAP处按下's'(按swap排序)
4.按'q'返回,再按下'x','b'(高亮显示)
5.按'W'保存配置到/root/.toprc,按'q'退出top,再执行: top -b -n1|head" && exit 1
fi

cd /etc/zabbix/zabbix_agentd.d/
cp userparameter.linux.sysctl.conf{.sample,}
cp userparameter.LLD.conf{.sample,}
cp userparameter.TCP.conf{.sample,}
chmod a+r *

PInfo "有下面一些可以启用的模块:"
Eval_cont "ls *.conf.sample"
echo '======================================='
PInfo "当前已启用的模块如下:"
Eval_cont "ls *.conf"
(( $(ls *.conf| wc -l) < 1 )) && PWarn "当前没启用任何模块,Zabbix不会执行这些自定义的监控模块"
echo '======================================='
PInfo "请检查是否所有脚本都有x权限:"
chmod a+x *.sh
Eval_cont "ls -l *.sh"

Eval_exit "systemctl restart zabbix-agent"
